Cortex-M3 的中断和异常
所有能打断正常执行流的事件都称为异常。日常沟通过程中,我们经常会混合使用术语"中断" 与 “异常”,这里强调的都是他们对主程序所体现出来的"中断"性质,与我们以前学单片机时所讲的概念是相同的。
Cortex-M3 在内核水平上搭载了一个异常响应系统,支持位数众多的系统异常和外部中断(如下图所示)。其中,编号为 1-15 的对应系统异常,大于等于 16 的则全是外部中断。除了个别异常的优先级被定死外,其它异常的优先级都是可编程的。
位置 | 优先级 | 优先级类型 | 名称 | 说明 | 地址 |
---|---|---|---|---|---|
- | - | - | 保留 | 0x0000_0000 | |
-3 | 固定 | Reset | 复位 | 0x0000_0004 | |
-2 | 固定 | NMI | 不可屏蔽中断 RCC时钟安全系统(CSS)联接到NMI向量 |
0x0000_0008 | |
-1 | 固定 | 硬件失效(HardFault) | 所有类型的失效 | 0x0000_000C | |
0 | 可设置 | 存储管理(MemManage) | 存储器管理 | 0x0000_0010 | |
1 | 可设置 | 总线错误 | 预取指失败,存储器访问失败 | 0x0000_0014 | |
2 | 可设置 | 错误应用(Bus Fault) | 预取指失败,存储器访问失败 | 0x0000_0018 | |
- | - | - | 保留 | 0x0000_001C~0x0000_002B | |
3 | 可设置 | SVCall | 通过 SWI 指令的系统服务调用 | 0x0000_002C | |
4 | 可设置 | 调试监控(DebuggerMonitor) | 调试监控器 | 0x0000_0030 | |
- | - | - | 保留 | 0x000_0034 | |
5 | 可设置 | PendSV | 可挂起的系统服务 | 0x0000_0038 | |
6 | 可设置 | SysTick | 系统滴答定时器 | 0x0000_003C |
这里中断和异常的区别在于,那 240 个中断对 CM3 核来说都是"意外突发事件"——也就是说,该请求信号来自 CM3 内核的外面,来自各种片上外设和外扩的外设,对 CM3 来说是"异步"的;而异常则是因 CM3 内核的活动产生的——在执行指令或访问存储器时产生,因此对 CM3 来说是"同步"的。